package pe.edu.upc.e41a.javasoft.service;

import java.util.List;

import javax.persistence.TypedQuery;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import pe.edu.upc.e41a.javasoft.domain.Publicacion;


@Service
@Transactional
public class PublicacionServiceImpl implements PublicacionService {

	public long countAllPublicacions() {
        return Publicacion.countPublicacions();
    }

	public void deletePublicacion(Publicacion publicacion) {
        publicacion.remove();
    }

	public Publicacion findPublicacion(Integer id) {
        return Publicacion.findPublicacion(id);
    }

	public List<Publicacion> findAllPublicacions() {
        return Publicacion.findAllPublicacions();
    }

	public List<Publicacion> findPublicacionEntries(int firstResult, int maxResults) {
        return Publicacion.findPublicacionEntries(firstResult, maxResults);
    }

	public void savePublicacion(Publicacion publicacion) {
        publicacion.persist();
    }

	public Publicacion updatePublicacion(Publicacion publicacion) {
        return publicacion.merge();
    }
	
	
	//DESDE PROYECTO SCV
	
	@Override
	public String registrarPublicacion(Publicacion publicacion) {
		String mensaje =null;
		try {
			mensaje = ValidaPublicacion(publicacion);
			if(mensaje!="ok") 
			return mensaje;
			mensaje = validaTitulo(publicacion);
			if (mensaje != "ok")
			return mensaje;
			
			if (mensaje != "ok")
				return mensaje;
			publicacion.persist();	
			mensaje="La publicación se registró exitosamente";
		} catch (Exception e) {
			//mensaje="Error al registrar publicación";
			//return mensaje;
		}
		
		return mensaje;
	}

	public String actualizarPublicacion(Publicacion publicacion) {
		String mensaje = null;
		try {
			publicacion.merge();
			mensaje = "La Publicacion se actualizo exitosamente";
		} catch (Exception e) {
			mensaje = "Error al actualizar publicacion";
			return mensaje;
		}

		return mensaje;
	}

	public String buscarPublicacionPorTituloIgual(String titulo) {
		String mensaje = null;
		try {
			TypedQuery<Publicacion> publicacionResultado = Publicacion
					.findPublicacionByTituloEquals(titulo);
			if (publicacionResultado.getResultList().size() == 0) {
				mensaje = "ok";
			} else {
				System.out.println("entro en el mensaje else");
				mensaje = "Ya existe una publicacion con este titulo";
			}
		} catch (Exception e) {
			mensaje = "Error en el método";
			return mensaje;
		}
		return mensaje;
	}
	
	private String ValidaPublicacion(Publicacion publicacion){
		String mensaje="ok";
		if (publicacion.getCategoria()==null) {
			mensaje="La categoria de la publicación no puede ser Nulo";
		} 
		else if (publicacion.getUsuario()==null) {
			mensaje="El usuario de la publicación no puede ser Nulo";
		}
		else if (publicacion.getTitulo()==null) {
			mensaje="El titulo de la publicación no puede ser Nulo";
		}
		else if (publicacion.getDescripcion()==null) {
			mensaje ="La descripción de la publicación no puede ser Nulo";
		} 
		else if (publicacion.getTipo()==null) {
			mensaje ="El tipo de la publicación no puede ser Nulo";
		} 
		else if (publicacion.getCantidad()==null) {
			mensaje ="La cantidad de la publicación no puede ser Nulo";
		} 
		else if (publicacion.getPrecio()==null) {
			mensaje ="el precio de la publicación no puede ser Nulo";
		}
		else if (publicacion.getFechaCreacion()==null) {
			mensaje ="La fecha de la publicación no puede ser Nulo";
		}
		else if (publicacion.getDuracion()==null) {
			mensaje ="La duarcion de la publicación no puede ser Nulo";
		}
		else if (publicacion.getEstado()==null) {
			mensaje ="El estado de la publicación no puede ser Nulo";
		} 
		
		return mensaje;
	}
	
	private String validaTitulo(Publicacion publicacion) {
		String mensaje = "ok";
		if (publicacion.getTitulo() != null) {
			mensaje = buscarPublicacionPorTituloIgual(publicacion
					.getTitulo());
		}
		return mensaje;
	}
	
	
	public List<Publicacion> listarPublicacionPorTituloODescripcion(
			String cadena) {
		List<Publicacion> lista;
		lista=Publicacion.listarPublicacionPorTituloODescripcion(cadena);
		return lista;
	}
	
	
	public TypedQuery<Publicacion> MostrarPublicacion(Integer IdPublicacion) {

		TypedQuery<Publicacion> publicacion = Publicacion.MostrarPublicacion(IdPublicacion);
		publicacion.getSingleResult();
		
	return publicacion;
		
	}

	
	public String actualizarEstadoPublicacion(Publicacion publicacion) {
		String mensaje = null;
		try {
			publicacion.merge();
			mensaje = "El estado de la publicación se actualizo exitosamente";
		} catch (Exception e) {
			mensaje = "Error al actualizar estado de publicación";
			return mensaje;
		}

		return mensaje;
	}



	
}
